package com.nibian.nibian.utils;

import android.content.Context;
import android.content.res.ColorStateList;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.text.TextUtils;
import android.view.View;
import android.widget.Toast;

import com.nibian.nibian.app.MyApplication;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;

/**
 * @创建者 lucy
 * @创建时间 2016/8/18 19:23
 * @描述 ${UI操作工具类}
 * @更新者 $Author$
 * @更新时间 $Date$
 * @更新描述 ${TODO}
 */
public class UiUtils {
    /**
     * 上下文
     *
     * @return
     */
    public static Context getContext() {
        return MyApplication.getContext();
    }

    /**
     * handler
     *
     * @return
     */
    public static Handler getHandler() {
        return MyApplication.getHanlder();
    }

    /**
     * 主线程 iconId
     *
     * @return
     */
    public static int getMainThreadId() {
        return MyApplication.getMainThreadId();
    }

    /**
     * 主线程
     *
     * @return
     */
    public static Thread getMainThread() {
        return MyApplication.getMainThread();
    }

    /**
     * 填充布局文件
     *
     * @param layoutId
     * @return
     */
    public static View inflate(int layoutId) {
        return View.inflate(getContext(), layoutId, null);
    }

    /**
     * 获取资源文件夹
     *
     * @return
     */
    public static Resources getResources() {
        return getContext().getResources();
    }

    /**
     * 获取 string 字符串
     *
     * @param resid
     * @return
     */
    public static String getString(int resid) {
        return getResources().getString(resid);
    }

    /**
     * 获取 string 数组
     *
     * @param resid
     * @return
     */
    public static String[] getStringArray(int resid) {
        return getResources().getStringArray(resid);
    }

    /**
     * 获取图片
     *
     * @param resid
     * @return
     */
    public static Drawable getDrawable(int resid) {
        return getResources().getDrawable(resid);
    }

    /**
     * dip2px. 公式: px/dp=比例
     *
     * @param dip
     * @return
     */
    public static int dip2px(int dip) {
        float density = getDensity(); // 获取比例
        return (int) (dip * density + .5f);
    }

    /**
     * px2dip. 公式: px/dp=比例
     *
     * @param px
     * @return
     */
    public static int px2dip(int px) {
        float density = getDensity();
        return (int) (px / density + .5f);
    }

    /**
     * 获取比例值, 根据不同手机获取不同的比例值
     *
     * @return
     */
    private static float getDensity() {
        return getResources().getDisplayMetrics().density;
    }

    /**
     * 保证任务在主线程中执行
     *
     * @param runnable
     */
    public static void runOnMainThread(Runnable runnable) {
        if (getMainThreadId() == android.os.Process.myTid()) { // 根据线程 iconId 判断当前线程是否 main thread
            runnable.run();                                    // 在 main thread 中, 直接执行
        } else {
            getHandler().post(runnable);                       // 在子线程中, 转 main thread 执行
        }
    }

    /**
     * 获取颜色选择器 ColorStateList
     *
     * @param resid
     * @return
     */
    public static ColorStateList getColorStateList(int resid) {
        return getResources().getColorStateList(resid);
    }

    /**
     * Toast
     *
     * @param text
     */
    public static void toast(String text) {
        Toast.makeText(getContext(), text, Toast.LENGTH_SHORT).show();
    }

    public static String bytesToHexString(byte[] src){
        StringBuilder stringBuilder = new StringBuilder("");
        if (src == null || src.length <= 0) {
            return null;
        }
        for (int i = 0; i < src.length; i++) {
            int v = src[i] & 0xFF;
            String hv = Integer.toHexString(v);
            if (hv.length() < 2) {
                stringBuilder.append(0);
            }
            stringBuilder.append(hv);
        }
        return stringBuilder.toString();
    }

    /**
     * 16进制转换10进制
     *
     * @param s
     * @return
     */
    public static int toTen(String s) {
        int parseInt = Integer.parseInt(s, 16);
        return parseInt;
    }

    /**
     * 将10进制转换16 进制
     *
     * @param data
     * @return
     */
    public static String toSixString(String data) {
        int i = Integer.parseInt(data);
        return String.format("%04X", i);
    }

    public static String to0XMul10(String data) {
        if (TextUtils.isEmpty(data)) {
            return "";
        }
        return to0XMul10(Float.parseFloat(data));
    }

    public static String to0XMul10(Float data) {
        return String.format("%04X", Math.round(getFloatFromStr(getPoit1Str(data)) * 10));
    }

    public static String to0XFloat(Float data) {
        return String.format("%04X", Math.round(getFloatFromStr(getPoit1Str(data))));
    }

    public static String to0XFloat(String data) {
        if (TextUtils.isEmpty(data)) {
            return "";
        }
        return String.format("%04X", Math.round(getFloatFromStr(getPoit1Str(Float.parseFloat(data)))));
    }


    public static String getPoit1Str(Float data) {
        String s = String.format("%.1f", data);
        return s;
    }

    public static Float getFloatFromStr(String data) {
        return Float.parseFloat(data);
    }


    /**
     * 将数据切分为两位 - 在将其转换为ascii码
     *
     * @param hex
     * @return
     */
    public static String convertHexToString(String hex) {

        StringBuilder sb = new StringBuilder();
        StringBuilder temp = new StringBuilder();
        // 49204c6f7665204a617661 split into two characters 49, 20, 4c...
        for (int i = 0; i < hex.length() - 1; i += 2) {
            // grab the hex in pairs
            String output = hex.substring(i, (i + 2));
            // convert hex to decimal
            int decimal = Integer.parseInt(output, 16);
            // convert the decimal to character
            sb.append((char) decimal);

            temp.append(decimal);
        }
        return sb.toString();
    }

    /**
     * 16进制转换为二进制 - 不够的在前面补0
     *
     * @param hexString
     * @return
     */
    public static String convertHexToBinary(String hexString) {
        long l = Long.parseLong(hexString, 16);
        String binaryString = Long.toBinaryString(l);
        int shouldBinaryLen = hexString.length() * 4;
        StringBuffer addZero = new StringBuffer();
        int addZeroNum = shouldBinaryLen - binaryString.length();
        for (int i = 1; i <= addZeroNum; i++) {
            addZero.append("0");
        }
        return addZero.toString() + binaryString;
    }
//
//    /**
//     * imageLoader的配置信息
//     *
//     * @return
//     */
//    public static DisplayImageOptions getImageLoaderOption() {
//        DisplayImageOptions options = new DisplayImageOptions.Builder()
//                // 设置图片在下载期间显示的图片
//                .showImageOnLoading(R.mipmap.ic_launcher)
//                // 设置图片Uri为空或是错误的时候显示的图片
//                .showImageForEmptyUri(R.mipmap.ic_launcher)
//                // 设置图片加载/解码过程中错误时候显示的图片
//                .showImageOnFail(R.mipmap.ic_launcher)
//                // 设置下载的图片是否缓存在内存中---三级缓冲    内存 本地  网络
//                .cacheInMemory(true)
//                // 设置下载的图片是否缓存在SD卡中
//                .cacheOnDisc(true)
//                // 保留Exif信息
//                //		.considerExifParams(true)
//                // 设置图片以如何的编码方式显示
//                .imageScaleType(ImageScaleType.EXACTLY_STRETCHED)
//                // 设置图片的解码类型
//                .bitmapConfig(Bitmap.Config.RGB_565)
//                // .decodingOptions(android.graphics.BitmapFactory.Options
//                // decodingOptions)//设置图片的解码配置
//                //		.considerExifParams(true)
//                // 设置图片下载前的延迟
//                .delayBeforeLoading(100)// int
//                // delayInMillis为你设置的延迟时间
//                // 设置图片加入缓存前，对bitmap进行设置
//                // .preProcessor(BitmapProcessor preProcessor)
//                .resetViewBeforeLoading(true)// 设置图片在下载前是否重置，复位
//                // .displayer(new RoundedBitmapDisplayer(20))//是否设置为圆角，弧度为多少
//                //		.displayer(new FadeInBitmapDisplayer(100))// 淡入
//                .build();
//        return options;
//    }

    /**
     * 使用文件通道的方式复制文件
     *
     * @param s 源文件
     * @param t 复制到的新文件
     */
    public static void fileChannelCopy(File s, File t) {
        FileInputStream fi = null;
        FileOutputStream fo = null;
        FileChannel in = null;
        FileChannel out = null;
        try {
            fi = new FileInputStream(s);
            fo = new FileOutputStream(t);
            in = fi.getChannel();//得到对应的文件通道
            out = fo.getChannel();//得到对应的文件通道
            in.transferTo(0, in.size(), out);//连接两个通道，并且从in通道读取，然后写入out通道
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                fi.close();
                in.close();
                fo.close();
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}




















